typedef void EventCallback(arg);

///订阅
class EventBus {
  /// 页面返回 刷新数据
  static String FRESHDATA = "FRESHDATA";
  ///接收到消息之后的刷新
  static String WX_ACCOP_REFRESH_MESSAGE = "WX_ACCOP_REFRESH_MESSAGE";
  //项目验收完毕
  static String SENDER_PROJECT_MANAGER_ACCEPT = "SENDER_PROJECT_MANAGER_ACCEPT";

  //退出页面，刷新列表
  static String SENDER_PROJECT_MANAGER_FINISH_AND_REFRESH =
      "SENDER_PROJECT_MANAGER_FINISH_AND_REFRESH";

  //项目管理未完成，刷新列表
  static String ADD_PRODUCT_WEIWANCHENG_AND_REFRESH =
      "ADD_PRODUCT_WEIWANCHENG_AND_REFRESH";

//鑫安云专家版 项目管理 创建项目
  static String EHS_PRODUCT_MANAGE_CREAT_PROJECT =
      "EHS_PRODUCT_MANAGE_CREAT_PROJECT";

// 从收藏页面 进入 详情 取消 收藏 刷新收藏列表

  static String GETCOLLECTION_ISGETCOLLECTION = "GETCOLLECTION_ISGETCOLLECTION";

  // 从购物车 进入 详情 加入 购物车 刷新 购车列表
  static String SELECTSHOPCART_ISSELECTSHOPCART =
      "SELECTSHOPCART_ISSELECTSHOPCART";

// 商城 订单页面 待发货 申请退款后 刷新 待发货列表
  static String ORDERS_DFH_SQTK = "ORDERS_DFH_SQTK";

  // 网校直播刷新
  static String WX_ZHIBO_GETDATA = "WX_ZHIBO_GETDATA";

  // 课程详情 切换 tabbar 在 评论页面 键盘 下落
  static String NETSCHOOL_COURSEINFO_COMMENTARY =
      "NETSCHOOL_COURSEINFO_COMMENTARY";

  // 切换到“我”页面，刷新我推荐的用户数量
  static String MY_referrerCount = "NETSCHOOL_COURSEINFO_COMMENTARY";

  // 忽略全部消息
  static String IGNORE_MESSAGEdaiban = "IGNORE_MESSAGEdaiban";
  // 忽略全部消息
  static String IGNORE_MESSAGE = "IGNORE_MESSAGE";
  // 消息弹框
  static String MESSAGE_TANKUANG = "MESSAGE_TANKUANG";

  // 切换到“首页”页面，请求邀请公司
  static String HOME_JOINCOMPANY = "HOME_JOINCOMPANY";

  // 考试列表数据
  static String KAOSHILISTDATA = "KAOSHILISTDATA";

  // 切换到“我”商城，解決方案
  static String SH_JIEJUEFANGAN = "SH_JIEJUEFANGAN";

  // 切换到“我”商城，防护用品
  static String SH_FHYP = "SH_FHYP";
  // 切换到“我”商城，防护用品
  static String SH_FHYP_FIST = "SH_FHYP_FIST";
  /// 保险展业 生成 保单之后 刷新 列表

  static String BXZY_SCBD_REFRESH_LIST = "BXZY_SCBD_REFRESH_LIST";

  /// 保险展业 生成 计划书 刷新 列表
  static String BXZY_SCJHS_REFRESH_LIST = "BXZY_SCJHS_REFRESH_LIST";

  /// 我的所属组织 选择 后的 刷新
  static String MY_ORGANIZATION_SELECTED_REFRESH =
      "MY_ORGANIZATION_SELECTED_REFRESH";

  /// 安全资讯键盘
  static String MY_SAFE_MESSAGE_REFRESH =
      "MY_SAFE_MESSAGE_REFRESH";

  /// 刷新风控支持数据
  static String FKZCLIST_REFRESH = "FKZCLIST_REFRESH";

  /// 保险展业 生成 保单之后 刷新 列表
  ///网校支付之后发送消息
  static String WX_ZHIFU_REFRESH_LIST = "WX_ZHIFU_REFRESH_LIST";

  static String WXKCFL = "WXKCFL";
  static String WXBJFL = "WXBJFL";

  static String TOKEN_CHANGE = "token_change";

  static String PER_CER_STATUS = "per_cer_status";//我的页面专家认证状态更新

  //私有构造函数
  EventBus._internal();

  //保存单例
  static EventBus _singleton = new EventBus._internal();

  //工厂构造函数
  factory EventBus() => _singleton;

  //保存事件订阅者队列，key:事件名(id)，value: 对应事件的订阅者队列
  var _emap = new Map<Object, List<EventCallback>>();

  //添加订阅者
  void on(eventName, EventCallback f) {
    if (eventName == null || f == null) return;
    _emap[eventName] ??= new List<EventCallback>();
    _emap[eventName].add(f);
  }

  //移除订阅者
  void off(eventName, [EventCallback f]) {
    var list = _emap[eventName];
    if (eventName == null || list == null) return;
    if (f == null) {
      _emap[eventName] = null;
    } else {
      list.remove(f);
    }
  }

  //触发事件，事件触发后该事件所有订阅者会被调用
  void emit(eventName, [arg]) {
    var list = _emap[eventName];
    if (list == null) return;
    int len = list.length - 1;
    //反向遍历，防止在订阅者在回调中移除自身带来的下标错位
    for (var i = len; i > -1; --i) {
      list[i](arg);
    }
  }

  //添加订阅者
  hasEvent(eventName) {
    if (eventName == null) return false;
    if (_emap[eventName] == null || _emap[eventName].length == 0) {
      return false;
    } else {
      return true;
    }
  }
}
